////////////////////////////////////////////////////////////////////
// Programme de traitement des accents de Chrono Cross
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// Nemesis pour Terminus Traduction (tt_nemesis@yahoo.fr)
// Date de création :		09/10/03
// Dernière modification :	10/02/04
////////////////////////////////////////////////////////////////////

// Entete
#include "Accents.h"

// Nombre de blocs des scénarii
char *APersos[ACC_MAX_NB];
_int16 Accent_Offset, Accent_Nb;
_int16 APerso_Nb;

/*------------------------------------------------------------------
  Initialisation des fichiers pour les personnages
------------------------------------------------------------------*/
void Accent_Infos (int inout)
{
	// Fichier des infos
	FILE *infos_f;
	// Nom de l'iso (chemin)
	char infos_nom[ACC_NOM_MAX];
	// Ligne
	char ligne[ACC_LIGNE_MAX];

	// Ouverture du fichier des infos principales
	sprintf(infos_nom,"%s%s%s.%s",
		DIR_INFOS,DIR_INFOS_GRP,INFOS_ACCENTS,EXT_INFOS);
	infos_f=fopen(infos_nom,"rb");

	if (infos_f==NULL)
		Main_Message_S("Erreur d'ouverture des infos.\n","",ER);
	else {
		// Réinitialisation
		APerso_Nb=0;
		// Table utilisée
		fgets(ligne,ACC_LIGNE_MAX,infos_f);
		ligne[strlen(ligne)-2]=0;
		// Chargement de la table de caractères
		Tbl_Libere();
		Tbl_Charge(ligne, inout);
		// Numero des fichiers d'accents
		fgets(ligne,ACC_LIGNE_MAX,infos_f);
		sscanf(ligne,"%d-%d",&Accent_Offset,&Accent_Nb);
		// Récupération des noms de fichiers
		while (fgets(ligne,ACC_LIGNE_MAX,infos_f)!=NULL)
			// Cas d'un commentaire ou d'un blanc
			if (ligne[0]!=COMMENT) {
				ligne[strlen(ligne)-2]=0;
				APersos[APerso_Nb]=strdup(ligne);
				APerso_Nb++;
			}
		// Fermeture du fichier des infos
		fclose(infos_f);
	}
}

/*------------------------------------------------------------------
  Ecriture d'une ligne du tableau vide
--------------------------------------------------------------------
 <- fich : fichier où écrire la ligne
 <- car1,car2 : ligne du type car1...car1car2car1...car1
------------------------------------------------------------------*/
void Accent_Ligne (FILE *out_f, char car1, char car2)
{
	int c,i;

	fputc(car2,out_f);
	for(c=0;c<Accent_Nb+1;c++) {
		for(i=0;i<ACC_COLONNE;i++)
			fputc(car1,out_f);
		fputc(car2,out_f);
	}
	fputc('\n',out_f);
}

/*------------------------------------------------------------------
  Placement dans le tableau
--------------------------------------------------------------------
 <- fich : fichier où se placer
 <- col,ligne : ligne et colonne où aller
------------------------------------------------------------------*/
void Accent_Placement (FILE *out_f, int ligne, int col)
{
	fseek(out_f,(2*ligne-1)*((Accent_Nb+1)*(ACC_COLONNE+1)+3)
		+(col+1)*(ACC_COLONNE+1)+2,SEEK_SET);
}

/*------------------------------------------------------------------
  Regroupement des accents en 1 seul fichier texte
------------------------------------------------------------------*/
void Accent_Regroupe (void)
{
	// Fichier entrant et sortant
	FILE *in_f,*out_f;
	char dossier[ACC_NOM_MAX];
	char fich_nom[ACC_NOM_MAX];
	char *fich_nom2;
	// Index des persos et accents
	int p,i;
	// Caractère lu
	char c;
	// Adresses
	_int16 adresses[ACC_MAX_NB];

	Main_Message_S("Rassemblement des accents...","",OK);

	// Chargement des noms des persos
	Accent_Infos(IN);
	// Ouverture du fichier regroupé
	sprintf(fich_nom,"%s%s.%s",DIR_TXT_IN,ACCENTS_IN,EXT_TXT);
	out_f=fopen(fich_nom,"w");
	// Ecriture du tableau vide
	Accent_Ligne(out_f,ACC_HORIZ,ACC_INTER);
	for(i=0;i<APerso_Nb-1;i++) {
		Accent_Ligne(out_f,ACC_ESPACE,ACC_VERT);
		Accent_Ligne(out_f,ACC_HORIZ,ACC_INTER);
	}
	// Noms des personnages
	for (p=1;p<APerso_Nb;p++) {
		Accent_Placement(out_f,p,-1);
		fputs(APersos[p],out_f);
	}
	// Remplissage du tableau
	for(i=0;i<Accent_Nb;i++) {
		// Ouverture du fichier d'accents
		sprintf(dossier,"%s%s%",DIR_FICH_IN,ACC_DIR);
		sprintf(fich_nom,"%04d",i+Accent_Offset);
		Fichier_Cherche(dossier,fich_nom,EXT_TBT,&fich_nom2);
		sprintf(fich_nom,"%s%s",dossier,fich_nom2);
		in_f=fopen(fich_nom,"r");
		if (in_f==NULL)
			Main_Message_D("Accents %02d introuvable.\n",
				i+Accent_Offset,ER);
		else {
			// Chargement des adresses
			for (p=0;p<APerso_Nb;p++) {
				fread(&adresses[p],sizeof(_int16),1,in_f);
			};
			// Accents inutilisables et inconnus
			if (i!=31) {
				// Recopie des accents
				for (p=1;p<APerso_Nb-1;p++) {
					// Placement dans les fichiers
					fseek(in_f,adresses[p],SEEK_SET);
					Accent_Placement(out_f,p,i);
					// Copie de l'accent
					while(ftell(in_f)<adresses[p+1]-1) {
						Tbl_Lecture(in_f,out_f);
					}
				};
				// Recopie de la fin de fichier
				fseek(in_f,adresses[p],SEEK_SET);
				Accent_Placement(out_f,p,i);
				c=fgetc(in_f);
				while(feof(in_f)==0) {
					fprintf(out_f,"%02x",c);
					c=fgetc(in_f);
				}
			};
			// Fermeture du fichier
			fclose(in_f);
		}
	}
	fclose(out_f);

	Main_OK();
}

/*------------------------------------------------------------------
  Réinsertion des accents dans les fichiers
------------------------------------------------------------------*/
void Accent_Partage (void)
{
	// Fichier entrant et sortant
	FILE *in_f,*out_f;
	char dossier[ACC_NOM_MAX];
	char fich_nom[ACC_NOM_MAX];
	char *fich_nom2;
	// Index des persos et accents
	int p,i;
	// Caractère lu
	char c;
	int res;
	// Adresses
	_int16 adresses[ACC_MAX_NB];
	// Chaine de chargement intermédiaire
	char chaine[ACC_COLONNE];
	// Chaine d'écriture de pointeur
	char ptr[10];

	Main_Message_S("Separation des accents...","",OK);

	// Chargement des noms des persos
	Accent_Infos(OUT);
	// Ouverture du fichier regroupé
	sprintf(fich_nom,"%s%s.%s",DIR_TXT_OUT,ACCENTS_OUT,EXT_TXT);
	in_f=fopen(fich_nom,"r");
	// Test douverture
	if (in_f==NULL)
		Main_Message_S("Accents regroupes introuvables.\n","",ER);
	else {
		// Recupération des informations du tableau
		for(i=0;i<Accent_Nb;i++) {
			// Accents inutilisables et inconnus
			if (i!=31) {
				// Ouverture du fichier d'accents
				sprintf(dossier,"%s%s%",DIR_FICH_OUT,ACC_DIR);
				sprintf(fich_nom,"%04d",i+Accent_Offset);
				Fichier_Cherche(dossier,fich_nom,EXT_TBT,&fich_nom2);
				sprintf(fich_nom,"%s%s",dossier,fich_nom2);
				out_f=fopen(fich_nom,"w");
				// Saut de la table des adresses
				fseek(out_f,APerso_Nb*sizeof(_int16),SEEK_SET);
				// Ecriture du code de l'accent
				adresses[0]=(_int16)ftell(out_f);
				fprintf(out_f,"%c%c%c",ACC_CODE,(char)i+1,0);
				// Recopie des accents
				adresses[1]=(_int16)ftell(out_f);
				for (p=1;p<APerso_Nb-1;p++) {
					// Placement dans le tableau
					Accent_Placement(in_f,p,i);
					// Détection de la chaine
					fscanf(in_f,"%s",chaine);
					// Copie de l'accent
					Tbl_Ecriture(chaine,out_f);
					sprintf(ptr,"%c%s%c",TBL_SPEC,TBL_PTR,TBL_SPEC);
					Tbl_Ecriture(ptr,out_f);
					adresses[p+1]=(_int16)ftell(out_f);
				};
				// Recopie de la fin du tableau
				Accent_Placement(in_f,p,i);
				res=fscanf(in_f,"%02x",&c);
				while(res>0 && c!=' ') {
					fputc(c,out_f);
					res=fscanf(in_f,"%02x",&c);
				}
				adresses[p+1]=(_int16)ftell(out_f);
				// Inscription des adresses
				fseek(out_f,0,SEEK_SET);
				for (p=0;p<APerso_Nb;p++) {
					fwrite(&adresses[p],sizeof(_int16),1,out_f);
				};
				// Fermeture du fichier
				fclose(out_f);
			};
		}
		fclose(in_f);
	}

	Main_OK();
}
